package modelo.AlgoHero;


import java.util.Timer;
import java.util.TimerTask;

import Titiritero.titiritero.ObjetoVivo;

import modelo.Excepciones.ColaVaciaException;
import modelo.Excepciones.ObjetoSinMasElementosExcepcion;

public class Reproductor implements ObjetoVivo{

	private CancionTraducida cancionTraducida;
	private ColaDeConjuntosReproducibles colaDeReproduccion;
	
	public Reproductor(Cancion cancion, ColaDeConjuntosReproducibles c){
		
		this.cancionTraducida = (CancionTraducida)cancion.traducir();
		this.colaDeReproduccion = c;
		
		
	}

	/**
	 * Este metodo recibe el tiempo de intervalo en el que hay que meter 
	 * un elemento de la cola. si la cola estuviera llena, saca primero un elemento
	 * para poder luego insertar otro.
	 * Una vez procesada toda la cancion, procede a vaciar la cola de elementos
	 * @param tiempoIntervalo
	 */
	public void reproducir(Long tiempoIntervalo)
	{
		final Timer timer = new Timer();
		TimerTask tarea = new TimerTask(){
		
			public void run() {
				
				if (getCancionTraducida().hasNext()){
					
					if (getColaDeReproduccion().estaLlena()){
						try {
							getColaDeReproduccion().getConjuntoReproducible();
						} catch (ColaVaciaException e) {
							e.printStackTrace();
						}
					}
					
					try {
						getColaDeReproduccion().insertaConjuntoElementosReproducibles
									(getCancionTraducida().getConjuntoReproducible());
					} catch (ObjetoSinMasElementosExcepcion e) {
						e.printStackTrace();
					}
				
				}else{			
					try {
						getColaDeReproduccion().getConjuntoReproducible();
					} catch (ColaVaciaException e) {
						e.printStackTrace();
					}
					
				}

				if ((!getCancionTraducida().hasNext())&&(colaDeReproduccion.estaVacia())){
					timer.cancel();
				}
			}
		};
		timer.scheduleAtFixedRate(tarea, 0, tiempoIntervalo);
	}
	
	public void actualizarCola(){
		
		if (getCancionTraducida().hasNext()){
			
			if (getColaDeReproduccion().estaLlena()){
				try {
					getColaDeReproduccion().getConjuntoReproducible();
				} catch (ColaVaciaException e) {
					e.printStackTrace();
				}
			}
			
			try {
				getColaDeReproduccion().insertaConjuntoElementosReproducibles
							(getCancionTraducida().getConjuntoReproducible());
			} catch (ObjetoSinMasElementosExcepcion e) {
				e.printStackTrace();
			}
		
		}else{			
			try {
				getColaDeReproduccion().getConjuntoReproducible();
			} catch (ColaVaciaException e) {
				e.printStackTrace();
			}
		}
		
	}

	@SuppressWarnings("unused")
	private void setCancionTraducida(CancionTraducida cancion) {
		this.cancionTraducida = cancion;
	}
	

	private CancionTraducida getCancionTraducida() {
		return this.cancionTraducida;
	}

	@SuppressWarnings("unused")
	private void setColaDeReproduccion(
			ColaDeConjuntosReproducibles colaDeReproduccion) {
		this.colaDeReproduccion = colaDeReproduccion;
	}

	private ColaDeConjuntosReproducibles getColaDeReproduccion() {
		return this.colaDeReproduccion;
	}

	/* (non-Javadoc)
	 * @see Titiritero.titiritero.ObjetoVivo#vivir()
	 */
	@Override
	public void vivir() {

		this.actualizarCola();
		
	}


	
}
